home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / wc.c < prev    next >
C/C++ Source or Header  |  1990-07-23  |  3KB  |  148 lines

  1. /* wc - count lines, words and characters    Author: David Messer */
  2.  
  3. #include <stdio.h>
  4. #define isspace(c) (c==' ' || c=='\t' || c=='\n' || c=='\f' || c=='\r')
  5.  
  6. /*
  7.  *
  8.  *    Usage:  wc [-lwc] [names]
  9.  *
  10.  *        Flags:
  11.  *            l - count lines.
  12.  *            w - count words.
  13.  *            c - count characters.
  14.  *
  15.  *        Flags l, w, and c are default.
  16.  *        Words are delimited by any non-alphabetic character.
  17.  *
  18.  *  Released into the PUBLIC-DOMAIN 02/10/86
  19.  *
  20.  *    If you find this program to be of use to you, a donation of
  21.  *    whatever you think it is worth will be cheerfully accepted.
  22.  *
  23.  *    Written by: David L. Messer
  24.  *                P.O. Box 19130, Mpls, MN,  55119
  25.  *      Program (heavily) modified by Andy Tanenbaum
  26.  */
  27.  
  28.  
  29. int lflag;            /* Count lines */
  30. int wflag;            /* Count words */
  31. int cflag;            /* Count characters */
  32.  
  33. long lcount;            /* Count of lines */
  34. long wcount;            /* Count of words */
  35. long ccount;            /* Count of characters */
  36.  
  37. long ltotal;            /* Total count of lines */
  38. long wtotal;            /* Total count of words */
  39. long ctotal;            /* Total count of characters */
  40.  
  41. main(argc, argv)
  42. int argc;
  43. char *argv[];
  44. {
  45.   int k;
  46.   char *cp;
  47.   int tflag, files;
  48.   int i;
  49.  
  50.   /* Get flags. */
  51.   files = argc - 1;
  52.   k = 1;
  53.   cp = argv[1];
  54.   if (argc > 1 && *cp++ == '-') {
  55.     files--;
  56.     k++;            /* points to first file */
  57.     while (*cp != 0) {
  58.         switch (*cp) {
  59.             case 'l':    lflag++;    break;
  60.             case 'w':    wflag++;    break;
  61.             case 'c':    cflag++;    break;
  62.             default:    usage();
  63.         }
  64.         cp++;
  65.     }
  66.   }
  67.  
  68.   /* If no flags are set, treat as wc -lwc. */
  69.   if (!lflag && !wflag && !cflag) {
  70.     lflag = 1;
  71.     wflag = 1;
  72.     cflag = 1;
  73.   }
  74.  
  75.   /* Process files. */
  76.   tflag = files >= 2;        /* set if # files > 1 */
  77.  
  78.   /* Check to see if input comes from std input. */
  79.   if (k >= argc) {
  80.     count(stdin);
  81.     if (lflag) printf(" %6ld", lcount);
  82.     if (wflag) printf(" %6ld", wcount);
  83.     if (cflag) printf(" %6ld", ccount);
  84.     printf(" \n");
  85.     fflush(stdout);
  86.     exit(0);
  87.   }
  88.  
  89.   /* There is an explicit list of files.  Loop on files. */
  90.   while (k < argc) {
  91.     FILE *f;
  92.  
  93.     if ((f = fopen(argv[k], "r")) == (FILE *) NULL) {
  94.         fprintf(stderr, "wc: cannot open %s\n", argv[k]);
  95.     } else {
  96.         count(f);
  97.         if (lflag) printf(" %6ld", lcount);
  98.         if (wflag) printf(" %6ld", wcount);
  99.         if (cflag) printf(" %6ld", ccount);
  100.         printf(" %s\n", argv[k]);
  101.         fclose(f);
  102.     }
  103.     k++;
  104.   }
  105.  
  106.   if (tflag) {
  107.     if (lflag) printf(" %6ld", ltotal);
  108.     if (wflag) printf(" %6ld", wtotal);
  109.     if (cflag) printf(" %6ld", ctotal);
  110.     printf(" total\n");
  111.   }
  112.   fflush(stdout);
  113.   exit(0);
  114. }
  115.  
  116. count(f)
  117. FILE *f;
  118. {
  119.   register int c;
  120.   register int word = 0;
  121.  
  122.   lcount = 0;
  123.   wcount = 0;
  124.   ccount = 0L;
  125.  
  126.   while ((c = getc(f)) != EOF) {
  127.     ccount++;
  128.  
  129.     if (isspace(c)) {
  130.         if (word) wcount++;
  131.         word = 0;
  132.     } else {
  133.         word = 1;
  134.     }
  135.  
  136.     if (c == '\n' || c == '\f') lcount++;
  137.   }
  138.   ltotal += lcount;
  139.   wtotal += wcount;
  140.   ctotal += ccount;
  141. }
  142.  
  143. usage()
  144. {
  145.   std_err("Usage: wc [-lwc] [name ...]\n");
  146.   exit(1);
  147. }
  148.